/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package entities.reponse;

import entities.question.AbstractQuestion;
import entities.questionnaire.Questionnaire;
import entities.utilisateur.AbstractRepondant;
import entities.utilisateur.AbstractUtilisateur;
import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author loic.vaugeois
 */
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)
@Table(name="reponse")
@NamedQueries({
@NamedQuery(name = "AbstractReponse.findRepondant", query
        = "SELECT r FROM AbstractReponse r "
        + " WHERE r.questionnaire = :questionnaire"
        + " AND r.repondant = :repondant "),
@NamedQuery(name = "AbstractReponse.countAllByQuestionnaire", query
        = "SELECT COUNT(DISTINCT ar.repondant) FROM AbstractReponse ar "
        + " WHERE ar.questionnaire = :questionnaire ")
})
public class AbstractReponse implements Serializable{
/*
 *ATTRIBUTS
 */
    /**
     * Id base de AbstractReponse
     */
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name="id_reponse")
    private long id;

    /**
     * Id Question concerne par la reponse
     */
    @ManyToOne
    @JoinColumn(name="id_question")
    private AbstractQuestion question;

    /**
     * Id Question concerne par la reponse
     */
    @ManyToOne
    @JoinColumn(name="id_questionnaire")
    private Questionnaire questionnaire;

    /**
     * Id du Répondant
     */
    @ManyToOne
    @JoinColumn(name="id_repondant")
    private AbstractRepondant repondant;

    /**
     * Date de la Réponse
     */
    @Column(name="date_reponse")
    @Temporal(TemporalType.DATE)
    private Calendar dateReponse;

/*
 ********************************GETTER SETTER
 */
    public void setQuestion(AbstractQuestion question) {
        if (question==null) throw new IllegalArgumentException("Une réponse ne peut pas être créée avec une question null.");
        this.question = question;
    }

    public void setRepondant(AbstractRepondant repondant) {
        if (repondant==null) throw new IllegalArgumentException("Une réponse ne peut pas être créée avec un répondant null.");
        this.repondant = repondant;
    }

    public AbstractQuestion getQuestion() {
        return question;
    }

    public AbstractRepondant getRepondant() {
        return repondant;
    }

    public Calendar getDateReponse() {
        return dateReponse;
    }

    public void setDateReponse(Calendar dateReponse) {
        this.dateReponse = dateReponse;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Questionnaire getQuestionnaire() {
        return questionnaire;
    }

    public void setQuestionnaire(Questionnaire questionnaire) {
        if (questionnaire==null) throw new IllegalArgumentException("Une réponse ne peut pas être créée avec un questionnaire null.");
        this.questionnaire = questionnaire;
    }


/*
 ***********************CONSTRUCTEUR
 */

    /**
     * Constructeur AbstractReponse
     * @param question
     * @param repondant
     */
    public AbstractReponse(AbstractQuestion question, AbstractRepondant repondant) {
        setQuestion(question);
        setRepondant(repondant);
    }

    /**
     * Constructeur nécessaire à JPA
     */
    public AbstractReponse(){

    }

}
